重構過程已經產生功能範圍、分析結果、架構決策、遷移規則、測試結果、版本、部署與監控資料。最後的文件工作不需要把這些內容重新抄成一份總報告,而要建立可以找到正確來源、判斷適用版本並隨變更更新的文件集合。
文件要協助讀者完成工作。只有名稱齊全但無法照著建立環境、判斷設計、執行切換或處理故障的內容,仍不足以支援後續維護。
每份文件都要先確認讀者與使用情境。同一項內容可以服務多個角色,不需要因此複製成多份彼此容易失去同步的文件。
| 讀者或使用情境 | 需要回答的問題 | 主要文件入口 |
|---|---|---|
| 第一次接觸專案 | 系統用途是甚麼,如何建立環境並執行基本檢查? | 專案說明文件、環境建立與共同指令 |
| 確認功能需求 | 哪些行為要保留、調整、捨棄或新增,如何驗收? | 功能規格、需求差異與驗收條件 |
| 修改程式 | 組成項目負責甚麼,可以依賴哪些介面與資料? | 架構圖、模組責任、契約與架構決策紀錄 |
| 驗證變更 | 要執行哪些案例,使用甚麼資料,如何判斷結果? | 測試策略、案例、基準與結果紀錄 |
| 執行部署或切換 | 要使用哪一份成品,步驟、停止條件與復原方式為何? | 發布、部署、遷移與切換程序 |
| 處理異常 | 如何判斷影響、查詢資料、暫時處置並確認恢復? | 維運手冊、監控儀表板與告警說明 |
| 評估後續變更 | 原本為甚麼採用這項設計,何時需要重新評估? | 架構決策紀錄、限制與風險清單 |
文件詳細程度要由錯誤理解的影響決定。常用且容易透過指令驗證的內容可以保持簡短,高風險且跨多項責任的切換與復原程序則需要完整前提、步驟、判斷與結果。
文件數量增加後,需要一個索引說明每項內容的權威來源與維護方式。索引不必複製正文,至少要記錄下列欄位:
| 欄位 | 記錄內容 |
|---|---|
| 文件名稱 | 穩定名稱與可存取位置 |
| 用途與讀者 | 支援的工作、適用角色與不涵蓋範圍 |
| 適用版本 | 原始碼、成品、資料結構、介面或環境版本 |
| 內容負責人 | 能確認內容正確並處理變更的人員 |
| 資訊來源 | 程式、Schema、設定、決策、測試或執行結果 |
| 更新條件 | 哪些變更會要求同步修改或重新產生 |
| 驗證方式 | 指令、測試、演練、審查或人工確認方式 |
| 最近確認 | 最近通過驗證的日期、版本與結果 |
| 保存狀態 | 目前有效、已取代、封存或待確認 |
「內容負責人」表示誰能確認與維護文件,不代表由一個人撰寫所有內容。責任轉移時要更新索引與存取方式,避免文件仍指向已無法處理問題的人員。
專案說明文件(README)適合提供第一次接觸專案時需要的最短路徑。GitHub 的 README 說明列出的常見內容包含專案用途、開始方式、求助位置與維護者資訊。
本系列的 README 可以包含:
README 應該保持可快速閱讀。需要多種情境、完整參數或故障處理的內容應該放在專用文件,再由 README 提供明確連結。
需求文件要說明目標系統準備完成甚麼結果,並保留遺留系統與目標系統之間的核准差異。至少包含:
需求改變時,要先更新差異與驗收條件,再調整程式與測試。只修改目前預期結果,卻刪除原本決定與原因,會讓後續人員無法判斷變更是否經過確認。
架構文件要回答系統包含哪些重要組成項目、各自負責甚麼、如何互動,以及哪些項目位於系統範圍外。圖表與文字應該互相補充,不需要用多張圖重複相同關係。
可以按照需要保存:
C4 模型(C4 Model)提供由系統環境、容器、元件到程式碼的分層視角,但不要求所有層級都必須繪製。C4 模型中的容器(Container)表示應用程式或資料儲存區,與部署技術中的容器具有不同語意。選擇任何表示方式時,圖表都要標示範圍、元素責任、關係方向、交換內容與圖例,並保存可以修改的來源檔案。
圖表不應該固定到每個類別與函式。這類細節容易隨實作變動,也通常能由程式與工具即時取得。長期文件應該保留會影響理解與變更判斷的穩定邊界。
架構決策紀錄(Architecture Decision Record, ADR)要保存一項重要設計決定在當時限制下如何形成。內容至少包含問題、適用範圍、候選方案、判斷資料、最終選擇、影響與重新評估條件。
新決定取代既有決定時,應該新增一筆 ADR,標示被取代與取代關係。直接改寫原紀錄會失去當時脈絡,也無法解釋舊版本為甚麼採用不同設計。文字錯誤可以修正,但決策內容的改變要保留歷程。
ADR 只保存需要長期理解的決定。一般程式修改、容易復原的局部選擇或已由明確規範決定的內容,可以留在提交、審查或規範紀錄中,避免決策集合充滿無法使用的細節。
資料文件要保存名稱、格式、語意、來源、限制與生命週期,不能只列出型別。如果系統使用資料庫,可以建立資料字典(Data Dictionary)記錄資料表、欄位、關係、限制與敏感程度。如果使用檔案、訊息或其他保存方式,也要提供對應的結構描述與欄位意義。
至少要涵蓋:
如果系統確實提供 HTTP 應用程式介面(Application Programming Interface, API),可以使用 OpenAPI Specification描述路徑、輸入、輸出與錯誤契約。其他互動方式則選擇符合檔案、命令、訊息或函式介面的格式。規格檔案可以產生說明頁面,但產生成功不能取代契約測試與語意審查。
只保留一份「全部通過」報告,無法重現當時的判斷。測試文件要連結需求、案例、版本、環境與實際結果:
大量自動化輸出可以由流程保存,不需要逐筆貼入人工文件。長期文件應該記錄取得方式、保存期限、摘要結果與對應版本,並確保重要失敗不會因執行紀錄到期而失去必要資訊。
發布與部署文件要讓維護人員找到「部署了甚麼、如何部署、如何確認,以及失敗時如何處理」。至少要保存:
程序中的每一步都要說明前置條件、操作、預期結果與失敗處理。只有指令而沒有判斷條件,操作人員仍無法知道何時可以繼續或必須停止。
維運手冊(Runbook)用來處理可辨識且可能再次發生的事件。每個項目應該從告警或現象開始,提供受控且可以驗證的處理流程。
一份維運手冊可以包含:
維運手冊要透過演練與實際事件持續修正。只在事故期間臨時輸入的命令容易遺漏前提,也可能無法在下一個版本使用。確認有效後,應該將必要步驟轉成共同指令或受控自動化,再保留操作入口與判斷方式。
程式註解適合說明程式附近無法直接表達的原因、限制、相容處理與公開契約。跨組成項目、跨環境或需要多個角色共同理解的內容,則應該放在可搜尋的系統文件。
兩者之間應該使用穩定識別與連結建立關係。例如,相容程式旁的註解可以引用 ADR、需求或風險識別碼,系統文件則連回負責實作與測試。不要把完整設計複製進註解,也不要只在外部文件記錄會直接影響函式正確使用的輸入與錯誤契約。
同一項資訊只應該有一個權威來源。可以從程式或 Schema 可靠取得的內容,優先由工具產生,再由人工文件補充目的、語意與限制。
| 內容 | 建議來源 | 人工需要補充的部分 |
|---|---|---|
| 公開介面欄位與型別 | Schema、介面規格或程式定義 | 欄位目的、使用限制、相容與錯誤語意 |
| 套件與版本 | 資訊清單、鎖定檔案與建置結果 | 採用原因、例外與更新決定 |
| 測試結果 | 自動化流程與測試工具 | 驗收判斷、核准差異與未解問題 |
| 部署版本 | 成品庫與部署平臺紀錄 | 變更目的、核准、觀察結果與處理決定 |
| 程式結構細節 | 原始碼與分析工具 | 穩定責任、邊界與重要相依方向 |
產生流程也要保存工具與規格版本,並在來源變更時重新產生。人工直接修改產生結果會在下次執行時消失,應該修改權威來源或把補充內容放在明確的擴充位置。
文件即程式碼(Docs as Code)將可文字化的文件、圖表來源與設定放入版本控制,並沿用變更審查與自動檢查流程。這可以讓文件與相關程式在同一項修改中更新,也能保留歷程與版本差異。
文件變更流程可以包含:
不適合文字版本控制的檔案仍要保存可修改來源、輸出格式與產生方式。圖表只保存圖片而沒有來源時,後續修改只能重畫,也無法可靠比較差異。
文件檢查不能只確認文字存在。應該按照使用情境驗證:
文件可以設定重新確認條件,例如介面版本變更、部署方式改變、維運手冊長期未演練或實際事件顯示步驟失效。固定日期審查可以補充保護,不能取代由內容變更觸發的更新。
過期文件如果仍會被搜尋到,就要清楚標示狀態、最後適用版本與替代位置。被取代的 ADR、發布紀錄、遷移結果與事件處理紀錄通常需要保留,因為它們能解釋過去版本。單純重複、錯誤或已無參考價值的操作說明,則可以在確認沒有必要連結後移除。
封存時要同步更新文件索引與入口,避免 README 或維運手冊繼續連到過期內容。正式切換完成後,也要區分目標系統現行文件、遺留系統唯讀參考與依法或依需求保存的歷史紀錄。
文件可以說明設定與秘密管理流程,但不得保存密碼、權杖、私鑰、實際憑證、連線內容或其他可直接取得敏感資料的值。
安全風險、已知限制與處理方式可以被記錄,實際可用的秘密內容則要留在專用管理機制。